10. Џупитер и Ексел¶
У овој лекцији ћемо говорити о:
- односу Џупитера и Ексела;
- о учитавању података из Ексел датотеке; и
- о уписивању података у Ексел датотеку.
10.1. Зашто Џупитер, а зашто Ексел¶
Мајкрософтов Ексел (Microsoft Excel) представља један од најраспрострањенијих софтверских производа за обраду табеларно представљених података. Ексел своју популарност дугује томе што је табела у коју се уносе подаци "опипљива", она је ту, корисник може само да кликне на поље и да унесе податак или формулу. Природно се намеће питање зашто овај курс није организован око Ексела. Разлога има много, а навешћемо неколико најважнијих.
Цена. За разлику од Ексела који је комерцијални производ и који мора да се купи да би могао легално да се користи, Пајтон, све његове библиотеке и Џупитер (као радно окружење за Пајтон) су бесплатни. Свако може без икакве накнаде да инсталира Пајтон и Џупитер и да их користи за личне потребе и за образовне потребе.
Обрада података путем јасно видљиве процедуре. У ћелије Ексел табеле се, поред текста и бројева, могу унети и формуле. На тај начин се у Екселу може постићи све о чему смо ми овде писали. Проблем са оваквим приступом настаје када покушавамо да схватимо шта табела у коју је неко већ унео формуле ради и како то она ради. У великим табелама није лако установити која формула зависи од које ћелије и, уопште, којим редом ће се формуле израчунавати. Дакле, лако је поделити са сарадницима Ексел табелу која ће одрадити посао, али није лако поделити са сарадницима процес који та табела имплементира. С друге стране, ако су подаци обрађени употребом неког скрипт-језика као што је Пајтон, из самог програма (и коментара у њему!) се може реконструисати процес обраде података. На тај начин сарадници на пројекту могу да провере процес обраде података и тако лакше уоче евентуалне грешке у процедури обраде података. Осим тога, ако је потребно извршити нови рачун који је сличан постојећем лакше је прилагодити експлицитан код.
Флексибилност. Пајтон долази са веома великим бројем библиотека које су развијане за потребе ефикасне обраде великих количина података. Све те библиотеке су доступне из Џупитера. Ако се за коју годину појави нека нова библиотека која нуди нове могућности, можемо је лако и брзо увести у Џупитер и користити. За разлику од Пајтона, нове функционалности Ексела се не дистрибуирају кроз библиотеке функција (које се лако додају систему), већ свака нова функционалност изискује инсталацију нове верзије целог програма.
Обрада података путем јасно наведених кратких програма (који нису део табеле!) представља најфлексибилнији начин обраде података и представља окосницу сваког озбиљног система за обраду података. Зато је важно да се сви сретнемо са програмирањем, чак иако не планирамо сви да будемо програмери!
10.2. Учитавање података из локалних Ексел датотека¶
Мајкрософтов Ексел (Microsoft Excel) представља један од најраспрострањенијих софтверских производа за обраду табеларно представљених података. Библиотека pandas зато има функцију која може да учита податке представљене Ексел табелом.
Структура Ексел документа је релативно сложена јер у једном документу може да се налази више табела. Један Ексел документ се, зато, састоји из неколико радних листова (енгл. work sheets):
па функцији за учитавање Ексел табеле поред имена датотеке треба дати и име радног листа са кога се учитава табела. Уколико се не наведе име радног листа функција ће учитати табелу из првог радног листа на који наиђе. Ово обично користимо само у ситуацијама када смо сигурни да Ексел радна свеска има само један радни лист.
Сада ћемо из датотеке Aditivi.xlsx која се налази у фолдеру podaci учитати табелу из (јединог) радног листа "Адитиви":
import pandas as pd
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Адитиви")
Ова датотека садржи податке о адитивима, што су супстанце које се користе у индустрији. Неки од њих се користе и у индустрији хране. (Подаци су преузети из уџбеника биологије за 8. разред.)
Ево првих неколико редова табеле:
aditivi.head(15)
Видимо да су ћелије које су биле празне у Ексел табели овде добиле специјалну вредност NaN што је скраћеница од not a number (енгл. "није број"). Ово је специјална вредност која се користи да се открију потенцијалне грешке које могу да настану приликом учитавања великих табела. У нашем случају празне ћелије у колони "Напомена" и треба да остану празне, па ћемо табелу учитати поново, с тим да ћемо "замолити Пајтон да искључи вештачку интелигенцију":
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Адитиви", na_filter=False)
aditivi.head(15)
Аргумент na_filter=False
каже функцији read_excel
да празне ћелије остану празне и да у њих не уноси вредност NaN.
Направићемо сада фреквенцијску анализу ове табеле на основу штетности адитива.
aditivi["Штетност"].value_counts()
Профилтрираћемо табелу да бисмо излистали адитиве који могу изазвати рак.
aditivi[aditivi.Напомена == "може изазвати рак"]
За крај, излистаћемо адитиве који су изузетно опасни или могу изазвати рак. У ту сврху треба да комбинујемо два критеријума:
Напомена == "може изазвати рак" или Штетност == "ИЗУЗЕТНО ОПАСАН"
Логички везник "или" се у библиотеци pandas
означава симболом |
. Према томе, податке добијамо тако што табели проследимо следећи захтев за филтрирање:
aditivi[(aditivi.Напомена == "може изазвати рак") | (aditivi.Штетност == "ИЗУЗЕТНО ОПАСАН")]
10.3. Уписивање табеле у Ексел датотеку¶
Било коју табелу можемо да упишемо и у Ексел датотеку као што смо их уписивали у CSV датотеке. Потребно је само позвати функцију to_excel
и проследити јој име датотеке. На пример, ако је opasni_aditivi
табела која садржи списак опасних адитива:
opasni_aditivi = aditivi[(aditivi.Напомена == "може изазвати рак") | (aditivi.Штетност == "ИЗУЗЕТНО ОПАСАН")]
њу можемо уписати у Ексел датотеку овако:
opasni_aditivi.to_excel("podaci/opasni_aditivi.xlsx", encoding="utf-8")
Аргумент encoding="utf-8"
морамо да проследимо функцији зато што у табели имамо податке који су записани ћирилицом, као што је био случај код писања у CSV датотеке. Ако сада отворимо ову датотеку из Ексела добићемо овакав изглед:
Видимо да је Пајтон уписао и индексну колону што нам у овом случају не одговара. Као и код уписивања у CSV датотеке можемо рећи Пајтону да у датотеку не уписује индексну колону тако што ћемо навести још и аргумент index=False
:
opasni_aditivi.to_excel("podaci/opasni_aditivi.xlsx", encoding="utf-8", index=False)
Ако сада нову датотеку учитамо из Ексела добијамо
За крај треба још мало проширити колоне у Ексел табели да би се улепшао њен изглед -- и готово!.
10.4. Задаци¶
Задатке реши у Џупитеру.
Задатак 1. Погледај пажљиво наредбе у следећој ћелији, па одговори на питања:
import pandas as pd
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Адитиви", na_filter=False)
- Шта ће урадити функција
read_excel
ако се уклони аргументsheet_name="Адитиви"
(знамо да табела има само један радни лист)? - Шта значи аргумент
na_filter=False
функцијеread_excel
?
Задатак 2. У табели podaci/SO2.xlsx
налазе се резултати мерења концентрације сумпор-диоксида у 2017. години у неким градовима Србије. Табела има четири колоне:
- МернаСтаница = Мерна станица
- СГВ = Средња годишња вредност у микрограмима по кубном метру
- БД125 = Број дана са више од 125 микрограма по кубном метру
- МДВ = Максимална дневна вредност у микрограмима по кубном метру
(а) Учитај ову табелу у структуру података DataFrame.
(б) Сортирај подаке по колони МДВ и прикажи вредности у овој колони хистограмом.
(в) Издвој из табеле оне редове код којих је вредност у колони БД125 већа од 0 и тако добијену табелу упиши у нову датотеку podaci/SO2-VisokeVrednosti.xlsx водећи рачуна о томе да табела садржи слова специфична за српски језик.
Задатак 3. У табели podaci/Razred.xlsx
налазе се оцене ученика једног разреда из информатике. Подаци су реални, па су зато анонимизирани (имена ученика су Učenik 1, Učenik 2, итд). Табела има заглавље, а текст је унет латиничним писмом.
(а) Учитај ову табелу у структуру података DataFrame и прикажи првих неколико редова да разумеш структуру табеле.
(Колоне означене са "K" представљају оцене из контролног задатка, колоне означене са "P" представљају оцену из писменог задатка (ово је латинично слово П), колоне означене са "U" представљају оцену из усмене провере, а колона "D" оцену из домаћих задатака.)
(б) Индексирај табелу колоном "Ime".
(в) Израчунај и испиши просечну оцену на сваком од три писмена задатка (колоне "P1", "P2" и "P3").
(г) Додај табели нову колону "Prosek" и онда за сваког ученика израчунај просек оцена и упиши добијену вредност у ову колону табеле.
(д) Додај табели нову колону "Ocena" и онда за сваког ученика израчунај закључну оцену на основу просека, и упиши ту оцену у ову колону табеле. Следећа функција ти може бити корисна:
def zaklj_ocena(prosek):
if prosek >= 4.50:
return 5
elif prosek >= 3.50:
return 4
elif prosek >= 2.50:
return 3
elif prosek >= 1.50:
return 2
else:
return 1
(д) Добијену табелу упиши у нову датотеку podaci/Razred-Ocene.xlsx водећи рачуна о томе да табела садржи слова специфична за српски језик.
Задатак 4. Eurostat је званична организација Европске уније која се бави статистичким анализама од значаја за рад и развој уније. Сви подаци које Eurostat прикупи и обради су јавно доступни на линку https://ec.europa.eu/eurostat/data/database
У датотеци podaci/EUProjPop.xlsx се налазе подаци о очекиваном броју становника ЕУ до 2080. године. Ова табела има два радна листа: Baseline на коме се налазе подаци о очекиваном броју становника, и Migration на коме се налазе подаци о очекиваном броју становника у случају повећаног броја миграната у земље Европске уније.
(а) Учитај ове две табеле у две структуре података DataFrame и за сваку прикажи првих неколико редова да разумеш структуру табела.
(б) Обема табелама додај нову врсту "EU", па за сваку табелу израчунај и у ту врсту упиши укупан очекивани број становника ЕУ за сваку од наведених година.
(в) Табели која је настала учитавањем радног листа Migration додај нову врсту "Migration" па у њу упиши очекивани прираштај броја становника у ЕУ услед миграције по годинама (то је разлика податка у врсти "EU" табеле "Migration" и одговарајућег податка у врсти "EU" табеле "Baseline").
(г) Прикажи линијским дијаграмом очекивани прираштај броја становника у ЕУ услед миграције по годинама.
(д) Табели која је настала учитавањем радног листа Baseline додај нову врсту "EU-UK", па израчунај и у ту врсту упиши укупан очекивани број станвника ЕУ за сваку од наведених година без становника Велике Британије.
(ђ) Табелу добијену на овај начин упиши у датотеку podaci/EU-UK.xlsx
Задатак 5. У табели podaci/Cricket.xlsx
се налазе подаци о најбољим играчима крикета. Ова табела има заглавље.
(а) Учитај ову табелу у структуру података DataFrame и испиши првих неколико редова табеле да видиш како изгледа. Индексирај табелу колоном "Player".
(б) Додај табели нову колону "YP" (Years Played) и у њу упиши колико година је сваки играч био активан. (За сваког играча од године у колони "To" одузети годину у колони "From").
(в) Додај табели нову колону "ARY" (Average Runs per Year) и у њу упиши количник бројева из колоне "Runs" и "YP". (ARY = Runs / YP).
(г) Сортирај табелу по колони "ARY" од највећих ка најмањим вредностима и прикажи првих 25 редова табеле. У ком веку су били активни скоро сви од ових 25 играча? Шта мислиш зашто?